home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Shareware / IDimager Personal 4.2.0.3 / setup_IDimager_Personal_V4.exe / {app} / Scripts / GPS Scripts / Reverse Lookup.psc < prev   
Text File  |  2008-07-21  |  4KB  |  124 lines

  1. {
  2.   This script will perform a reverse lookup for all selected images that have
  3.   GPS coordinates stored in their XMP data.
  4.  
  5.   A reverse lookup means that the script will try to determine some real information
  6.   based on the location information (latitude/longitude). The info that will be
  7.   retrieved (if possible) is:
  8.  
  9.   Location (street + number)
  10.   City
  11.   State
  12.   Country
  13.   CountryCode (3 positions)
  14.  
  15.   Date first version: 2008-07-21
  16.  
  17.   Version: 1.0
  18.   Date version: 2008-07-21
  19.   Author: Hertwig van Zwietering
  20. }
  21.  
  22. var
  23.   AGps: TGPSReadWrite;
  24.   AXmp: TXMP;
  25.   ACatItem: TCatalogItem;
  26.   ALat, ALon, AAlt: Double;
  27.   AStamp: TDateTime;
  28.   ALocation: TidElement;
  29.   AHit: Integer;
  30. begin
  31.   if not Ask ('Are you sure you want to perform a reverse lookup for the selected images? This will only affect images that have GPS coordinates stored in their XMP.') then
  32.     exit;
  33.  
  34.   // initialize the progress info
  35.   Progress.Cancel := False;
  36.   Progress.ProgressBar := True;
  37.   Progress.UseProgress;
  38.   Progress.Max := Selected.Count;
  39.   Progress.Show;
  40.  
  41.   // reset the counter that will count all images that got "handled"
  42.   AHit := 0;
  43.   for i := 0 to Selected.Count - 1 do
  44.   begin
  45.     // set the progress info
  46.     Progress.ProgressText := Selected.Items[i].FileName;
  47.     Progress.Pos := i + 1;
  48.     if Progress.Cancel then
  49.       break;
  50.  
  51.     ACatItem := TCatalogItem.Create (nil);
  52.  
  53.     // find the image in the catalog
  54.     if Catalog.FindImageCombined (Selected.Items[i], ACatItem, False, vptNone) then
  55.     begin
  56.       AXmp := TXMP.Create(False);
  57.  
  58.       // load its XMP
  59.       Catalog.LoadXMPForItem (ACatItem, AXmp, Options.CachedXMP);
  60.  
  61.       // any GPS info? If not then it has no use to perform a reverse lookup
  62.       if AXmp.HasGPS then
  63.       begin
  64.         // initialize the data so they are typed when calling GetGPSStamp
  65.         ALat := 0; ALon := 0; AAlt := 0; AStamp := Now();
  66.         // read the GPS info from XMP
  67.         if AXmp.GetGPSStamp (ALat, ALon, AAlt, AStamp) then
  68.         begin
  69.           // a container for the reverse lookup results
  70.           ALocation := TidElement.Create (nil);
  71.           ALocation.Name := 'ReverseGPSData';    // not required but nice to do
  72.  
  73.           AGps := TGPSReadWrite.Create;
  74.           // perform the reverse lookup.
  75.           AGps.ReverseLookup (ALat, ALon, ALocation, False);
  76.  
  77.           //Say (ALocation.SaveAsXML);            // enable this line for testing the result content
  78.  
  79.           // push the reverse location data back to the XMP
  80.           if Nvl(ALocation.Prop['Location'], '') <> '' then
  81.             AXmp.QuickSetProperty ('http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/', 'Iptc4xmpCore:Location', Nvl(ALocation.Prop['Location'], ''));
  82.  
  83.           if Nvl(ALocation.Prop['CountryCode3'], '') <> '' then
  84.             AXmp.QuickSetProperty ('http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/', 'Iptc4xmpCore:CountryCode', Nvl(ALocation.Prop['CountryCode3'], ''));
  85.  
  86.           if Nvl(ALocation.Prop['City'], '') <> '' then
  87.             AXmp.QuickSetProperty ('http://ns.adobe.com/photoshop/1.0/', 'photoshop:City', Nvl(ALocation.Prop['City'], ''));
  88.  
  89.           if Nvl(ALocation.Prop['State'], '') <> '' then
  90.             AXmp.QuickSetProperty ('http://ns.adobe.com/photoshop/1.0/', 'photoshop:State', Nvl(ALocation.Prop['State'], ''));
  91.  
  92.           if Nvl(ALocation.Prop['Country'], '') <> '' then
  93.             AXmp.QuickSetProperty ('http://ns.adobe.com/photoshop/1.0/', 'photoshop:Country', Nvl(ALocation.Prop['Country'], ''));
  94.  
  95.           if Nvl(ALocation.Prop['LocationSummary'], '') <> '' then
  96.           begin
  97.             // if there's a summary for the location then add it as the description, but only if there is no pre-existing description
  98.  
  99.             if Nvl (AXmp.QuickGetProperty ('http://purl.org/dc/elements/1.1/', 'dc:description'), '') = '' then
  100.               AXmp.QuickSetProperty ('http://purl.org/dc/elements/1.1/', 'dc:description', Nvl(ALocation.Prop['LocationSummary'], ''));
  101.           end;
  102.  
  103.           // and save the modified XMP
  104.           Catalog.SaveXMPForItem (ACatItem, AXmp, Options.CachedXMP);
  105.  
  106.           AGps.Free;
  107.           ALocation.Free;
  108.         end;
  109.       end;
  110.  
  111.       AXmp.Free;
  112.     end;
  113.  
  114.     ACatItem.Free;
  115.   end;
  116.  
  117.   Progress.Hide;
  118.  
  119.   if Progress.Cancel then
  120.     Say (WideFormat ('Cancelled; %d images processed so far', [AHit]))
  121.   else
  122.     Say (WideFormat ('Finished; %d images processed', [AHit]));
  123. end;
  124.